/**
 *  vector.h
 *  AwkwardEngine - Math
 *
 *  Date: 19/08/2013
 *
 *  Language: C++
 *
 *  @author Carl McCaffrey
 *
 */
#ifndef VECTOR_H
#define VECTOR_H

#define CVEC_POSITION	1.0f
#define CVEC_VECTOR		0.0f

typedef struct _cVec{
	float x, y, z, w;
} cVec;

/* Initialization */
inline cVec cVecZero(void);
inline cVec cVecSet(float x, float y, float z, float w);

/* General Operations */
inline cVec cVecAdd( cVec vec1, cVec vec2);
inline cVec cVecSubtract(cVec vec1, cVec vec2);
inline cVec cVecMultiply(cVec vec1, cVec vec2);
inline cVec cVecDivide(cVec vec1, cVec vec2);
inline cVec cVecSelect( cVec vec1, cVec vec2, cVec control);

/* 2D Operations */
inline bool cVecEqual2D(cVec vec1, cVec vec2);
inline bool cVecGreater2D(cVec vec1, cVec vec2);
inline bool cVecGreaterEqual2D(cVec vec1, cVec vec2);
inline bool cVecLess2D(cVec vec1, cVec vec2);
inline bool cVecLessEqual2D(cVec vec1, cVec vec2);

inline float cVecDot2D(cVec vec1, cVec vec2);
inline float cVecMagnitude2D(cVec vec);
inline cVec cVecNormalize2D(cVec vec);

/* 3D Operations */
inline bool cVecEqual3D(cVec vec1, cVec vec2);
inline bool cVecGreater3D(cVec vec1, cVec vec2);
inline bool cVecGreaterEqual3D(cVec vec1, cVec vec2);
inline bool cVecLess3D(cVec vec1, cVec vec2);
inline bool cVecLessEqual3D(cVec vec1, cVec vec2);

inline float cVecDot3D(cVec vec1, cVec vec2);
inline float cVecMagnitude3D(cVec vec);
inline cVec cVecNormalize3D(cVec vec);

/* 4D Operations */
inline bool cVecEqual4D(cVec vec1, cVec vec2);
inline bool cVecGreater4D(cVec vec1, cVec vec2);
inline bool cVecGreaterEqual4D(cVec vec1, cVec vec2);
inline bool cVecLess4D(cVec vec1, cVec vec2);
inline bool cVecLessEqual4D(cVec vec1, cVec vec2);

inline float cVecDot4D(cVec vec1, cVec vec2);
inline float cVecMagnitude4D(cVec vec);
inline cVec cVecNormalize4D(cVec vec);

#include "../../source/math/vector_general.inl"
#include "../../source/math/vector_2d.inl"
#include "../../source/math/vector_3d.inl"
#include "../../source/math/vector_4d.inl"

#endif // VECTOR_H